package com.wang.listener;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

/**
 * 事件监听器
 * 满足条件才执行
 * 异步执行
 */
@Slf4j
@Component
public class PushAsyncEventProcessor {


    @Async("dobThreadPool")
    @EventListener(classes = {Push.class}, condition = "#event.status == true")
    public void process(Push event) {
        log.info("指定线程池 dobThreadPool，异步执行事件监听...：【{}】", event.getStatus());
    }

    /**
     * BEFORE_COMMIT：事务提交之前执行，执行异常会导致事务回滚
     * AFTER_COMMIT：事务提交之后执行，不会影响事务
     * AFTER_ROLLBACK：事务回滚之后执行
     * AFTER_COMPLETION：事务完成时执行，这里的完成是指无论事务是成功提交还是事务回滚
     */
    @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
    public void whenCommit(Push push) {
        // 只有事务已提交之后，触发事件
        log.info("Transaction committed...");
    }
}

